package com.mgq.juc.design.twoPhaseStop;

import lombok.extern.slf4j.Slf4j;

/**
 * @author MaGuangQi
 * 同步模式之Balking模式
 * balking模式用在一个线程发现另外一个线程已经做了某一件事情了,它将不再重复做,直接返回
 * @date 2021-12-17 16:37
 **/
@Slf4j
public class TestTwoPhaseStopBalking {


    public static void main(String[] args) throws InterruptedException {
        Monitor t1 = new Monitor();
        t1.start("t1");
        t1.start("t2");
        t1.start("t3");
    }


}

@Slf4j
class Monitor {
    // 此时用volatile不行,因为 @1-@4 不是一个操作(涉及到变量的读取和写入).volatile只能保证可见,不能保证原子性
    //此时应该保证原子性,因此使用synchronized
    private boolean starting = false;

    public void start(String name) {

        Thread t1 = new Thread(() -> {

            synchronized (this) {

                if (starting) {  // @1
                    return;      // @2
                }                // @3
                starting = true; // @4
            }
            log.debug("执行监控任务");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, name);
        t1.start();
    }
}
